

package com.mt.mall.controller.good;

import org.springframework.security.access.prepost.PreAuthorize;
import com.mt.common.core.annotation.ApiPageParam;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import com.mt.common.core.web.base.PageDTO;
import com.mt.common.core.web.base.PageResultDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


import com.mt.mall.dto.good.CollectEditDto;
import com.mt.mall.entity.good.Collect;
import com.mt.mall.service.good.CollectService;
import com.mt.mall.service.good.CommodityService;
import com.mt.common.system.service.AttachmentService;
import com.mt.common.system.service.UserService;


@Api(tags = "收藏")
@RestController
@RequestMapping("/api/mall/good/Collect")
@CrossOrigin(allowCredentials = "true")
public class CollectController {
    private static Logger logger = LoggerFactory.getLogger(CollectController.class);


    @Autowired
    private CollectService collectService;
    @Autowired
    private CommodityService commodityService;
    @Autowired
    private AttachmentService attachmentService;
    @Autowired
    private UserService userService;

    /**
     * 根据分页参数查询收藏集合
     *
     * @param pageDTO 分页条件
     */
    @PreAuthorize("hasAuthority('mall:good:Collect:view')")
    @ApiOperation("分页查询收藏")
    @ApiPageParam
    @PostMapping("/findCollects")
    public PageResultDTO findCollects(@RequestBody PageDTO pageDTO) {
        return this.collectService.findCollects(pageDTO);
    }

    /**
     * 根据ID查询指定的收藏
     *
     * @param collectId Id
     */
    @PreAuthorize("hasAuthority('mall:good:Collect:view')")
    @ApiOperation("根据id查询收藏")
    @ApiPageParam
    @PostMapping("/findCollect")
    public Collect findCollect(@RequestParam Long collectId) {
        return this.collectService.findCollect(collectId);
    }

    /**
     * 根据ID查询指定的收藏(包含外键名称)
     *
     * @param collectId Id
     */
    @PreAuthorize("hasAuthority('mall:good:Collect:view')")
    @ApiOperation("根据ID查询指定的收藏(包含外键名称)")
    @PostMapping("/findCollectForView")
    public Collect findCollectForView(@RequestParam Long collectId) {
        return this.collectService.findCollectWithForeignName(collectId);
    }

    /**
     * 根据ID查询指定的收藏(包含收藏和外键名称)
     *
     * @param collectId Id
     */
    @PreAuthorize("hasAuthority('mall:good:Collect:view')")
    @ApiOperation("根据ID查询指定的收藏(包含收藏和外键名称)")
    @PostMapping("/findCollectForEdit")
    public CollectEditDto findCollectForEdit(@RequestParam Long collectId) {
        CollectEditDto collectEditDto = new CollectEditDto();
        collectEditDto.setCollect(this.collectService.findCollectWithForeignName(collectId));

        this.prepareCollectEditDto(collectEditDto);

        return collectEditDto;
    }

    /**
     * 根据ID查询指定的收藏(只提取ID 和 Name)
     *
     * @param collectId Id
     */
    @PreAuthorize("hasAuthority('mall:good:Collect:view')")
    @ApiOperation("根据ID查询指定的收藏(只提取ID 和 Name)")
    @PostMapping("/findCollectsWithIdNameById")
    public Collect findCollectsWithIdNameById(@RequestParam Long collectId) {
        return this.collectService.findCollectsWithIdNameById(collectId);
    }

    /**
     * 根据名称查询收藏集合(只提取ID 和 Name)
     *
     * @param collectName 名称
     */
    @PreAuthorize("hasAuthority('mall:good:Collect:view')")
    @ApiOperation("根据名称查询收藏集合(只提取ID 和 Name)")
    @PostMapping("/findCollectsWithIdNameByName")
    public List<Collect> findCollectsWithIdNameByName(@RequestParam String collectName) {
        return this.collectService.findCollectsWithIdNameByName(collectName);
    }


    /**
     * 创建新的收藏
     */
    @PreAuthorize("hasAuthority('mall:good:Collect:add')")
    @ApiOperation("创建新的收藏")
    @PostMapping("/createCollect")
    public CollectEditDto createCollect() {
        CollectEditDto collectEditDto = new CollectEditDto();
        collectEditDto.setCollect(new Collect());

        this.prepareCollectEditDto(collectEditDto);
        return collectEditDto;
    }

    private void prepareCollectEditDto(CollectEditDto collectEditDto) {
        //TODO: 以下代码可以注释掉，此行代码即时加载所有外键对象，以便选择。如果不在此加载，可以在界面上实现延迟加载。如果外键对象超过 500 行，建议采用延迟加载
        collectEditDto.setCommodityCommoditys(this.commodityService.findAllCommoditysWithIdName());
        //TODO: 以下代码可以注释掉，此行代码即时加载所有外键对象，以便选择。如果不在此加载，可以在界面上实现延迟加载。如果外键对象超过 500 行，建议采用延迟加载
        collectEditDto.setAttachmentsAttachments(this.attachmentService.findAllAttachmentsWithIdName());
        //TODO: 以下代码可以注释掉，此行代码即时加载所有外键对象，以便选择。如果不在此加载，可以在界面上实现延迟加载。如果外键对象超过 500 行，建议采用延迟加载
        collectEditDto.setUserUsers(this.userService.findAllUsersWithIdName());
    }

    /**
     * 新增保存收藏
     *
     * @param collect 实体对象
     */
    @PreAuthorize("hasAuthority('mall:good:Collect:add')")
    @ApiOperation("新增保存收藏")
    @PostMapping("/saveCollect")
    public Collect saveCollect(@RequestBody Collect collect) {
        return this.collectService.saveCollect(collect);
    }

    /**
     * 修改保存收藏
     *
     * @param collect 实体对象
     */
    @PreAuthorize("hasAuthority('mall:good:Collect:update')")
    @ApiOperation("修改保存收藏")
    @PostMapping("/updateCollect")
    public Collect updateCollect(@RequestBody Collect collect) {
        return this.collectService.updateCollect(collect);
    }

    /**
     * 根据ID删除收藏
     *
     * @param collectId ID
     */
    @PreAuthorize("hasAuthority('mall:good:Collect:remove')")
    @ApiOperation("根据ID删除收藏")
    @PostMapping("/deleteCollect")
    public void deleteCollect(@RequestParam Long collectId) {
        this.collectService.deleteCollect(collectId);
    }


}

